﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace model
{
    /// <summary>
    /// 这是一个ViewModel，用来绑定到View，填充数据。
    /// </summary>
    public class UserModel : INotifyPropertyChanged
    {
        private string _name;
        private string _age;
        private string _email;

        public string Name
        {
            get => _name;
            set
            {
                if (_name != value)
                {
                    _name = value;
                    OnPropertyChanged(nameof(Name)); // 这里手动触发了 PropertyChanged 事件，WPF 的数据绑定系统会订阅 PropertyChanged 事件。然后做相应的处理。
                    // 也可以手动订阅这个事件。
                }

            }
        }

        public string Age
        {
            get => _age;
            set { _age = value; OnPropertyChanged(); }
        }

        public string Email
        {
            get => _email;
            set { _email = value; OnPropertyChanged(); }
        }

        public UserModel()
        {
            ConfirmCommand = new RelayCommand(_ => OnConfirm());
        }

        /// <summary>
        /// 确定按钮，绑定的命令
        /// </summary>
        public ICommand ConfirmCommand { get; }
        private void OnConfirm()
        {
            // 这里处理“确定”按钮的逻辑
            MessageBox.Show($"姓名: {Name}\n年龄: {Age}\n邮箱: {Email}", "提交信息");

            //  开发者可以手动订阅 PropertyChanged 事件，执行自定义逻辑。
            var person = new UserModel();
            if (this != null)
            {
                person = this;
            }
            // 手动订阅属性变更事件
            person.PropertyChanged += (sender, args) =>
            {
                Console.WriteLine($"Property {args.PropertyName} has changed!");
                // 这里的sender 就是 person ，如果在这里设置了person的其他属性，导致递归触发事件，甚至引发无限循环。
                // 因此，在这种情况下，需要小心处理逻辑，避免递归问题。
            };

            // 修改属性，触发事件
            person.Name = "John Doe";  // 输出：Property Name has changed!
            person.Age = "40";
            person.Email = "mailfendou@163.com";

        }

        // 实现 INotifyPropertyChanged 接口
        public event PropertyChangedEventHandler PropertyChanged;

        protected void OnPropertyChanged([CallerMemberName] string propertyName = null)
            => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }
}
